#include <stdio.h>
#include "queue.h"

void init_queue(CircularQueue *q)
{
    q->count = 0;
    q->front = 0;
    q->rear = 0;
}
/*  
当指针（front或rear）到达数组末尾时，通过取模运算让指针回到数组开头，形成环形结构。
保证了指针永远在[0, QUEUE_SIZE-1]范围内循环。
当队列已满（count == QUEUE_SIZE）时，新数据会覆盖最旧数据，此时需要同时移动front和rear。
*/
int enqueue(CircularQueue *q, float data)
{
    if(q->count < QUEUE_SIZE){
        q->buffer[q->rear] = data;
        q->rear =  (q->rear + 1)%QUEUE_SIZE;//rear始终指向队末（即将入队的位置）
        q->count++;
        return 1;
    }else{
        q->buffer[q->rear] = data;
        q->rear = (q->rear + 1)%QUEUE_SIZE;//
        q->front = (q->front + 1)%QUEUE_SIZE;//front始终指向队首（最早入队的位置）
        return 0;
    }
    return 0;
}
/* 
这里的data代表出队的数据
*/
int dequeue(CircularQueue *q, float *data) {
    if (q->count == 0) return 0;  // 空队列
    
    *data = q->buffer[q->front];
    q->front = (q->front + 1) % QUEUE_SIZE;
    q->count--;
    return 1;
}